雖然我們可以使用標準的**net/http
**套件來實現這些API,但使用現有的網頁框架會更容易,
它們提供了大量的功能,例如routing
, parameter binding
, validation
, middleware
,其中一些甚至內置了ORM。
以下是按其GitHub Stars數量排序的一些最受歡迎的Golang
Web Frameworks與Routers:
go get -u github.com/gin-gonic/gin
現在,我們要創建一個名為 api
的新資料夾。接著,在其中創建一個名為 server.go
的新檔案。我們將在這裡實現我們的HTTP API伺服器。
首先,讓我們定義一個新的 Server
結構。此 Server
將為我們的banking service處理所有HTTP Request。它將有兩個欄位:
db.Store
。當處理來自客戶端的API請求時,它將允許我們與資料庫進行互動。gin.Engine
的router。此router將幫助我們將每個API請求傳送到正確的處理程序進行處理。api/**server.go**
package api
import (
db "github.com/Kcih4518/simpleBank_2023/db/sqlc"
"github.com/gin-gonic/gin"
)
type Server struct {
store *db.Store
router *gin.Engine
}
func NewServer(store *db.Store) *Server {
server := &Server{store: store}
router := gin.Default()
// TODO: add routes to router
server.router = router
return server
}
為何在NewServer
中router
不會是隨著server
作為參數傳入,而是在NewServer
中進行初始化?
store
),而路由的初始化和配置可以在**Server
**結構體或其方法中完成。NewServer
函數中或其他Server
的方法中修改router
**的初始化和配置。gin.Default()
是什麼呢?
**gin.Default()
**是Gin框架中用於建立一個帶有預設middleware的router engine
gin.Default()
函數會將 Logger
和 Recovery
中間件添加到 Gin Engine 實例中:
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
engine.Use(Logger(), Recovery())
return engine
}
GIn
除了**gin.Default()
**還有什麼router
engine
可以設置?
除了**gin.Default()
,Gin還提供了另一個方法來建立router
,那就是gin.New()
。使用gin.New()
**創建的router
不包括任何middleware
,它是一個naked middleware。
func New() *Engine {
debugPrintWARNINGNew()
engine := &Engine{
RouterGroup: RouterGroup{
Handlers: nil,
basePath: "/",
root: true,
},
...
}
return engine
}
這意味著,當您想要完全自定義middleware
時,可以使用**gin.New()
**,然後根據需要手動添加middleware
。
goCopy code
router := gin.New()
router.Use(gin.Logger()) // 添加日誌中間件
router.Use(gin.Recovery()) // 添加恢復中間件
使用**gin.New()
提供了更大的靈活性,允許您根據需求選擇和配置中間件。但如果您想要一個快速設置且帶有常用中間件的路由器,則gin.Default()
**是一個很好的選擇。